/**
 * @param {number[]} nums
 * @return {boolean}
 */
 var canPartition = function(nums) {
  // 先求得这个数组的和
  let sum = nums.reduce((p,val)=>p + val,0)
  // 如果sum是奇数就返回false
  if(sum & 1) return false
  // 背包问题 求这个有没有子集 就是判断这个子集的元素和是不是等于sum/2
  // 背包的容量就是sum/2 元素的重量和价值都是nums[i]
  // 背包的递推公式是 dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i])
  // 初始化 是正整数 就都初始化为0 如果有负数就初始化为负无穷
  // dp[i]表示容量为i的背包的能容纳的和
  let len = nums.length
  let dp = new Array(sum/2 + 1).fill(0) // 初始化背包 背包的容量是sum/2 为了方便取到sum/2 需要+1 因为数组是从0开始的
  for(let i = 0;i < len;i++){ // 遍历物品 这里就是这个数组
      for(let j = sum/2;j >= nums[i];j--){
          // 从后向前遍历 最后面的索引也就是背包的容量是sum/2 判断当这个背包的容量大于这个数字的值的时候,让背包容量-- 判断这个dp数组的值
          dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i])
          // // 判断如果这个dp[j] === sum/2 那就直接返回 如果这个的和是sum/2 name就可以直接返回了
          if(dp[j] === sum/2){ // j代表容量 就是容量为j的时候他的价值是不是sum/2
              console.log(j)
              return true
          }
      }
  }
  return dp[sum/2] === sum/2
};